package com.ten.java.doinit.service.create.impl;

import com.ten.java.doinit.common.Context;
import com.ten.java.doinit.service.create.CreateFileService;
import com.ten.java.doinit.service.DBService;
import com.ten.java.doinit.util.DateUtils;
import com.ten.java.doinit.util.IOUtils;
import com.ten.java.doinit.util.StringUtils;

import java.io.File;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author zhangxs
 * @date 2022/7/8 15:21
 */
public class CreateModelFileService implements CreateFileService {

    @Override
    public String getDirName() {
        return "model";
    }

    @Override
    public void createFile(String dirPath, Map<String, List<DBService.Column>> tableInfo) {
        Set<Map.Entry<String, List<DBService.Column>>> entries = tableInfo.entrySet();
        StringBuilder fileBuffer = new StringBuilder();
        for (Map.Entry<String, List<DBService.Column>> entry : entries) {
            String tableName = entry.getKey();
            List<DBService.Column> columns = entry.getValue();

            // 创建文件
            String fileName = StringUtils.camelFormat(tableName, true);
            File file = new File(dirPath + File.separator + fileName + ".java");

            // 写入包路径
            fileBuffer.append(StringUtils.format("package <>.<>;", Context.Config.packagePath, getDirName())).append(StringUtils.ENTER).append(StringUtils.ENTER);

            // 引入依赖
            fileBuffer.append("import lombok.Data;").append(StringUtils.ENTER);
            fileBuffer.append("import javax.persistence.Entity;").append(StringUtils.ENTER);
            fileBuffer.append("import javax.persistence.Id;").append(StringUtils.ENTER).append(StringUtils.ENTER);

            // 写入类注释
            fileBuffer.append("/**").append(StringUtils.ENTER);
            fileBuffer.append(" * ").append(StringUtils.ENTER);
            fileBuffer.append(" * @author ").append(Context.Config.author).append(StringUtils.ENTER);
            fileBuffer.append(" * @date ").append(DateUtils.now(Context.Config.pattern)).append(StringUtils.ENTER);
            fileBuffer.append(" */").append(StringUtils.ENTER);;

            // 写入类注解
            fileBuffer.append("@Data").append(StringUtils.ENTER);
            fileBuffer.append(StringUtils.format("@Entity(name=\"<>\")", tableName)).append(StringUtils.ENTER);

            // 写入类名称
            fileBuffer.append(StringUtils.format("public class <> {", fileName)).append(StringUtils.ENTER);

            // 依次写入字段信息
            columns.forEach(column -> {
                fileBuffer.append(StringUtils.ENTER).append(StringUtils.TAB).append(StringUtils.format("// <>", column.getColumnComment())).append(StringUtils.ENTER);
                String type = Context.Config.columnMap.get(column.getDataType());
                String columnKey = column.getColumnKey();
                if ("PRI".equals(columnKey)) {
                    fileBuffer.append(StringUtils.TAB).append("@Id").append(StringUtils.ENTER);
                }
                String fieldName = StringUtils.camelFormat(column.getColumnName(), false);
                fileBuffer.append(StringUtils.TAB).append(StringUtils.format("private <> <>;", type, fieldName)).append(StringUtils.ENTER);
            });

            // 写入类最后一个括号
            fileBuffer.append("}");

            // 将数据写入到文件
            IOUtils.write(fileBuffer.toString(), file, Context.Config.charset);
            fileBuffer.delete(0, fileBuffer.length());
        }
    }
}
